package leetcode.linkedlist;

import leetcode.linkedlist.model.ListNode;

public class ReverseLinkedList {
    public static ListNode reverseLinkedList(ListNode head) {
        // 单链表为空或只有一个节点，直接返回原单链表
        if (head == null || head.next == null) {
            return head;
        }
        // null -> 1 -> 2 -> 3 -> null
        // 2 -> 1 -> null
        // cur.next -> pre
        // pre = cur
        ListNode pre = null;
        ListNode cur = head;
        ListNode next = null;
        while (cur != null) {
            // 因为下面会改掉 cur.next，为了 cur 的 next 信息不丢失，要提前保存下来。
            next = cur.next;

            // 本质就是 next 改为指向 pre，然后指针往后移，不断重复。
            cur.next = pre; // 将当前节点next域指向前一个节点 null <- 1 <- 2 <-3
            pre = cur; // pre 指针向后移动，pre指向当前节点
            cur = next; // cur 指针向后移动，下一个节点变成当前节点
        }
        return pre;
    }
}
